package org.xx.armory.swing;

import org.xx.armory.swing.components.ConfirmDialog;
import org.xx.armory.swing.components.ConfirmInputDialog;
import org.xx.armory.swing.components.DialogPane;
import org.xx.armory.swing.components.LineInputDialog;
import org.xx.armory.swing.components.LinesInputDialog;
import org.xx.armory.swing.components.PopupDialog;

import java.awt.Window;
import java.util.Date;

import static org.apache.commons.lang3.StringUtils.join;
import static org.xx.armory.swing.ComponentUtils.showModel;

/**
 * 对话框工具类，用于调用各种通用对话框。
 */
public class DialogUtils {
    /**
     * 显示确认对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param message
     *         需要确认的消息。
     * @return 是否确认。
     */
    public static boolean confirm(
            Window owner,
            String message
    ) {
        return confirm(owner, message, null);
    }

    /**
     * 显示双重确认对话框。
     *
     * <p>第一次确认后，还需要输入指定的值进行第二步确认。</p>
     *
     * @param owner
     *         对话框的所有者。
     * @param message
     *         需要确认的消息。
     * @param expectedValue
     *         第二步确认时需要输入的值，如果此参数是{@code null}或者是空字符串则不进行第二步确认。
     * @return 是否确认。
     */
    public static boolean confirm(
            Window owner,
            String message,
            String expectedValue
    ) {
        final ConfirmDialog dlg = new ConfirmDialog(message);
        boolean result = showModel(owner, dlg) == DialogPane.YES;

        if (result) {
            if (expectedValue != null && !expectedValue.isEmpty()) {
                final ConfirmInputDialog dlg2 = new ConfirmInputDialog(expectedValue);
                return showModel(Application.mainFrame(), dlg2) == DialogPane.OK;
            } else {
                return true;
            }
        } else {
            return false;
        }
    }

    /**
     * 显示提示对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param message
     *         提示消息。
     */
    public static void prompt(
            Window owner,
            String message
    ) {
        showModel(owner, new PopupDialog(PopupDialog.PROMPT, message));
    }

    /**
     * 显示警告对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param message
     *         警告消息。
     */
    public static void warn(
            Window owner,
            String message
    ) {
        showModel(owner, new PopupDialog(PopupDialog.WARN, message));
    }

    /**
     * 显示失败对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param message
     *         失败消息。
     */
    public static void fail(
            Window owner,
            String message
    ) {
        showModel(owner, new PopupDialog(PopupDialog.FAIL, message));
    }

    /**
     * 显示提示输入文本的对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param prompt
     *         提示消息。
     * @param defaultValue
     *         默认值。
     * @return 输入的内容，如果用户拒绝输入则返回{@code null}。
     */
    public static String inputText(
            Window owner,
            String prompt,
            String defaultValue
    ) {
        final LineInputDialog dlg = new LineInputDialog(prompt, LineInputDialog.TEXT, defaultValue);
        showModel(owner, dlg);
        return dlg.getTextResult();
    }

    /**
     * 显示提示输入多行文本的对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param prompt
     *         提示消息。
     * @param defaultValue
     *         默认值。
     * @return 输入的内容，如果用户拒绝输入则返回{@code null}。
     */
    public static String inputMultiLineText(
            Window owner,
            String prompt,
            String... defaultValue
    ) {
        final String text = defaultValue != null ? join(defaultValue, "\n") : "";
        final LinesInputDialog dlg = new LinesInputDialog(prompt, text);
        showModel(owner, dlg);
        return dlg.getTextResult();
    }

    /**
     * 显示提示输入密码的对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param prompt
     *         提示消息。
     * @param defaultValue
     *         默认值。
     * @return 输入的内容，如果用户拒绝输入则返回{@code null}。
     */
    public static String inputPassword(
            Window owner,
            String prompt,
            String defaultValue
    ) {
        final LineInputDialog dlg = new LineInputDialog(prompt, LineInputDialog.PASSWORD, defaultValue);
        showModel(owner, dlg);
        return dlg.getPasswordResult();
    }

    /**
     * 显示提示输入日期的对话框。
     *
     * @param owner
     *         对话框的所有者。
     * @param prompt
     *         提示消息。
     * @param defaultValue
     *         默认值。
     * @return 输入的内容，如果用户拒绝输入则返回{@code null}。
     */
    public static Date inputDate(
            Window owner,
            String prompt,
            Date defaultValue
    ) {
        final LineInputDialog dlg = new LineInputDialog(prompt, LineInputDialog.DATE, defaultValue);
        showModel(owner, dlg);
        return dlg.getDateResult();
    }
}
